// 对象(class-level)声明 (同时也声明了一个构造函数)
function Monkey(name, gender, age) {
    this.name = name;
    this.gender = gender;
    this.age = age;
}

// 使用构造函数来创建实例(instance)
let m = new Monkey('孙行者', '男', 18);
console.log(m);

let o = new Monkey('行者孙', '男', 17);
console.log(o);

let n = new Monkey('者行孙', '男', 16);
console.log(n);

console.log('- - - - - - - - - - - - - - - - - - - - - - -');

// JSON: JavaScript Object Notation
let x = {
    id: 1001,
    name: '猪悟能',
    gender: '男',
    age: 16
}

console.log(x);

let y = {
    name: '猪刚鬣',
    gender: '男',
    age: 16
}

console.log(y);

let z = {
    name: '猪八戒',
    gender: '男',
    age: 16,
    address: '福陵山云栈洞'
}

console.log(z);

console.log('- - - - - - - - - - - - - - - - - - - - - - -');

// Object.create( prototype )

let pure = Object.create(null);
console.log(pure);
console.log(pure.constructor); // undefined
console.log(pure.__proto__); // undefined
console.log(Object.getPrototypeOf(pure)); // null

let p = { id: 1001, name: '张三丰', age: 108 }
    // 以 变量 p 所引用的实例 为原型 创建一个新的 实例
let ins = Object.create(p);
console.log(ins);
console.log(ins.id, ins.name, ins.age);
console.log(ins.constructor); // 谁构造了ins引用的实例
console.log(ins.__proto__); // 获得ins所引用实例的对象的原型
console.log(Object.getPrototypeOf(ins));

console.log(ins.__proto__ === p); // true
console.log(Object.getPrototypeOf(ins) === p); // true

// 使用 hasOwnProperty 函数判断 属性是否是 ins 所引用实例 所 "自有的"
console.log(ins.hasOwnProperty('id')); // false
console.log(ins.hasOwnProperty('name')); // false
console.log(ins.hasOwnProperty('age')); // false

// 【问题】
// 若执行以下语句
ins.name = '张君宝';
// 在以上语句执行后，下面的语句输出什么?
console.log(p.name);
console.log(ins.name)